package com.ycsj.goldmedalnewconcept.view;
 
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

import com.ycsj.goldmedalnewconcept.R;
public class AutoSizeTextView extends TextView {  
    // 自定义控件在XML中的命名空间  
    private static final String XML_NAMESPACE = "http://www.xxxx.com.cn";  
    // 最小TextSize值  
    private float minTextSize;  
    // 最大TextSize值  
    private float maxTextSize;  
  
    /** 
     * 构建AutoSizeTextView. 
     *  
     * @param context 
     * @param attrs 
     */  
    public AutoSizeTextView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
  
        // 获得XML中定义的属性  
        TypedArray typeArray = context.obtainStyledAttributes(attrs,  
                R.styleable.AutoSizeTextView);  
        minTextSize = typeArray.getDimensionPixelSize(  
                R.styleable.AutoSizeTextView_minTextSize, 8);  
  
        typeArray.recycle();  
  
        if (minTextSize == 8) {  
            minTextSize = attrs.getAttributeIntValue(XML_NAMESPACE,  
                    "min_textSize", 8);  
        }  
  
//        maxTextSize = getTextSize(); 
        maxTextSize = 20;
        if (maxTextSize <= minTextSize) {  
            maxTextSize = minTextSize;  
        }  
    }  
  
    /** 
     * 构建AutoSizeTextView. 
     *  
     * @param context 
     */  
    public AutoSizeTextView(Context context) {  
        super(context);  
  
        minTextSize = 8;  
//        maxTextSize = getTextSize();  
        maxTextSize =20;
        if (maxTextSize <= minTextSize) {  
            maxTextSize = minTextSize;  
        }  
  
    }  
  
    /** 
     * 设置最小Size 
     *  
     * @param minTextSize 
     */  
    public void setMinTextSize(int minTextSize) {  
        this.minTextSize = minTextSize;  
    }  
  
    /** 
     * 当View的Text发生变化后就调用该事件 
     *  
     * @param text 
     *            TextView显示的文本 
     * @param start 
     *            对文本进行了修改的范围的开始偏移量 
     * @param lengthBefore 
     *            被替换的旧的文本长度 
     * @param lengthAfter 
     *            替换修改后的文本的长度 
     */  
    @Override  
    protected void onTextChanged(CharSequence text, int start, int before,  
            int after) {  
        super.onTextChanged(text, start, before, after);  
        refreshText(text.toString(), getWidth());  
    }  
  
    /** 
     * 当View的Size发生变化后就调用该事件 
     *  
     * @param w 
     *            该View的当前宽度 
     * @param h 
     *            该View的当前高度 
     * @param oldw 
     *            该View的旧宽度 
     * @param oldh 
     *            该View的旧高度 
     */  
    @Override  
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
        if (w != oldw) {  
            refreshText(getText().toString(), w);  
        }  
    }  
  
    /** 
     * 重新设定View的TextSize，以便在文本框中显示的文本适合文本框指定的宽度。 
     *  
     * @param text 
     *            显示的文本内容 
     * @param textWidth 
     *            文本的宽度 
     */  
    private void refreshText(String text, int textWidth) {  
        if (textWidth > 0) {  
            int availableWidth = textWidth - getPaddingLeft()  
                    - getPaddingRight();  
            float trySize = maxTextSize;  
            while ((trySize > minTextSize)  
                    && (getTextWidth(text, trySize) > availableWidth)) {  
                trySize -= 1;  
                if (trySize <= minTextSize) {  
                    trySize = minTextSize;  
                    break;  
                }  
            }  
            this.setTextSize(trySize);  
        }  
    }  
  
    /** 
     * 获取Text的宽度 
     *  
     * @param text 
     * @param size 
     * @return 
     */  
    private float getTextWidth(String text, float size) {  
        float scale = getContext().getResources().getDisplayMetrics().density;  
        float w;  
        if (scale == 1.0f) {  
            Paint textPaint = new Paint();  
            textPaint.set(getPaint());  
            textPaint.setTextSize(size);  
            w = textPaint.measureText(text);  
        } else {  
            TextView view = new TextView(getContext());  
            view.setText(text);  
            view.setTextSize(size);  
            view.measure(  
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
            view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());  
            w = view.getWidth();  
        }  
        return w;  
    }  
}  